グラフィックス液晶 INT035
LED タッチ オンオフ
(→プロジェクトファイル(Harmony Ver.2.04版 ) ダウンロード)
液晶に表示されるボタン(スイッチ)ウィジェットをクリックするとLEDがオンオフするプログラムです。このプログラムを設計する場合を 例にしてグラフィック液晶を使う場合の ① MHCの設定 ② グラフィック液晶INT035のドライバーの組み込み方法 ③ Graphics Composerによる液晶画面表示の操作方法 ④ 外部I/Oの制御方法 などを説明します。 |
<仕様>
・Harmony Ver.2のグラフィックスライブラリを使い液晶画面にボタンウィジェット(以下、ボタンと云う)を表示する。
・ボタンの表面には "LED ON/OFF"と表示する。文字は黒色とする。
・ボタン表面色は 水色(skyblue)とし、背景色は黄緑色(lightgreen)とする。
・グラフィック液晶は Displaytech社のINT035(3.5インチ、QVGA)とする。
・ボタンをクリックすると 4個のLEDが消灯している場合は点灯し、点灯している場合は消灯すること。
尚、LEDはPIC起動後は消灯していること。
・LEDの点灯、消灯動作はボタンをリリース(指を離した時)のイベントにもとづき行われること。
・ボタンのチャタリング対策を織り込むこと。
・キャラクタ液晶も接続しタッチの位置を表示すること。 タッチ位置の座標原点(X= 0, Y = ,0)は左上とし、右下は(X = 320,
Y = 240)とする。
尚、タッチされていない場合は X = -1, Y = -1を表示のこと
・PIC起動時、キャラクタ液晶に以下を 2sec 表示すること
1行目: Harmony Graphics
2行目: LED Touch OnOff
<回路図> (→PDFファイル)
<外観>PIC32MZ評価ボード(→購入方法)を使った実験品の外観です。
<動作結果> (→ 動画:1080pのHD動画を見ることができます。)
①タッチの瞬間 | ②右下を鉛筆でクリックした瞬間 | ③起動直後のキャラクタ液晶画面 |
<解説> 記載してある内容は要点だけです。 詳細はプロジェクトファイルを精読願います。
(以下は、Harmony v2.04 をもとに作成しています。最新のバージョンとは異なる点があるかもしれませんので注意してください。)
■ 新規プロジェクトの作成 (→ 新規プロジェクト作成手順)
PICは、PIC32MZ2048EFH100を選択します。 グラフィックに係る特段の設定はありません。
忘れないで設定項目しておく項目としてencodingに Shift_JISを選択しておくことがあげられます。 これを忘れるとコメント欄が文字化けして
しまいます。
■ MHC設定 1 Options & Pin Settingsの設定
■ Options
■Pin Settings
LEDが接続されているポートを 出力モードに設定します。
項 目 |
① RG15ポート | ② RD4、RA14、RA15 |
M H C |
||
備 考 |
デフォルトからの変更要領: Function: GPIO_OUT |
デフォルトからの変更要領: Function: GPIO_OUT |
■ MHC設定2 Graphics Composerの設定
■キャラクタ液晶表示ライブラリの追加要領
キャラクタ液晶表示のライブラリ 1lcd_lib_XC32.h と 1lcd_lib_XC32.cを main.cと同じフォルダにコピーして、プロジェクトに追加します。
(使い方 → キャラクタ液晶表示方法 参照)
プロジェクトへの追加は以下のようにします。
■ INT035用グラフィックライブラリの追加要領
INT035用グラフィックライブラリを以下の要領で組み込みます。
以下の説明ではプロジェクトフォルダは"C:\microchip\harmony\v2_04\_WK\sample204\gfx1\01
035 Led OnOff" です。
① | drv_gfx_generic.h |
"C:\microchip\harmony\v2_04\_WK\sample204\gfx1 \01 035 Led OnOff\firmware\src\system_config\default\framework\gfx\driver\controller\generic\drv_gfx_generic.h" 上記パスにあるdrv_gfx_generic.hを開きファイル内容をすべて削除したあと、ys_drv_gfx_int035.h(以下参照)のファイル内容をコピーして貼り付けます。 (備考) "C:\microchip\harmony\v2_04\framework\gfx\driver\controller\generic\templates\drv_gfx_generic.h.ftl" 上記ファイルの内容をys_drv_gfx_int035.hの内容に変更しておくとMHCが自動的に所要の drv_gfx_generic.hを生成してくれます。また煩わしいプロジェクトファイル再生成時のチェックが発生しなくなります。 以下、ys_drv_gfx_int035.h |
|
② | drv_gfx_generic.c |
"C:\microchip\harmony\v2_04\_WK\sample204\gfx1 \01 035 Led OnOff\firmware\src\system_config\default\framework\gfx\driver\controller\generic\drv_gfx_generic.c" 上記パスにあるdrv_gfx_generic.cを開きファイル内容をすべて削除したあと、ys_drv_gfx_int035.c(以下参照)のファイル内容をコピーして貼り付けます。 (備考) "C:\microchip\harmony\v2_04\framework\gfx\driver\controller\generic\templates\drv_gfx_generic.c.ftl" 上記ファイルの内容をys_drv_gfx_int035.cの内容に変更しておくとMHCが自動的に所要の drv_gfx_generic.hを生成してくれます。また煩わしいプロジェクトファイル再生成時のチェックが発生しなくなります。 以下、ys_drv_gfx_int035.c |
|
③ | gfx_driver_def.c |
"C:\microchip\harmony\v2_04\_WK\sample204\gfx1 \01 035 Led OnOff\firmware\src\system_config\default\framework\gfx\hal\gfx_driver_def.c" 上記パスにあるgfx_driver_def.cを開きファイル内容をすべて削除したあと、ys_gfx_driver_def_int035.c(以下参照)のファイル内容をコピーして貼り付けます。 以下、ys_gfx_driver_def_int035.c |
|
④ | drv_touch_generic.h |
"C:\microchip\harmony\v2_04\framework\driver\touch\generic\drv_touch_generic.h" drv_touch_generic.hの内容を削除したあと、ys_drv_touch_generic_int035.h(以下参照)のファイル内容をコピーして貼り付けます。 (備考) このファイルはMHCの内部ファイルを変更することになるので、以降MHCが自動的に所要の drv_touch_generic.hを生成してくれます。 以下、ys_drv_touch_generic_int035.h |
|
⑤ | drv_touch_generic.c |
"C:\microchip\harmony\v2_04\framework\driver\touch\generic\src\drv_touch_generic.c" drv_touch_generic.cの内容を削除したあと、ys_drv_touch_generic_int035.c(以下参照)のファイル内容をコピーして貼り付けます。 (備考) このファイルはMHCの内部ファイルを変更することになるので、以降MHCが自動的に所要の drv_touch_generic.hを生成してくれます。 以下、ys_drv_touch_generic_int035.c |
■ app.cに、青字部分を追加します。
①インクルードファイルを追加します。stdio.hがないと、sprintf( )がコンパイラのバージョンによってコンパイルで警告となることが
あります。
#include <stdio.h>
#include "1lcd_lib_XC32.h"
② 所要の変数定義します。 システムクロックは200MHzです。
int delay_Clock = 200000000; //200MHz
char Buf[32];
③ delay_us( )、delay_ms( ) という NOPを使った 1μsec 、1msec単位の遅延関数をつくります。HarmonyではSYS_Tasks
( )の中で
長い時間の遅延をつかうとその遅延時間だけタスクがそこで止まってしまいますので注意して使う必要があります。
void delay_us(volatile unsigned int usec) //1μsec遅延
{
volatile int count;
……
……
④ キャラクタ液晶を初期化して"Harmony Graphics" "LED Touch OnOff"を表示する部分です。 (→ キャラクタ液晶表示方法 参照)
lcd_init(); // LCD初期化
lcd_cmd(0b00001100); // カーソル:OFF ブリンク:OFF
lcd_clear();
lcd_cmd(0x80); //1目の先頭へ
……
……
⑤ MyLibariaEvents( )は、グラフィック液晶INT035へのタッチ位置をリアルタイム(SYS_TASKS( ))で検出し、キャラクタ液晶に表示する関数です。
libaria_events.cに定義されています。
尚、libaria_events.cの場所は "C:\microchip\harmony\v2_04\_WK\sample204\gfx1\01
035 Led OnOff
\firmware\src\system_config\default\framework\gfx\libaria\libaria_events.c"です。
MyLibariaEvents(); //グラフィック関連イベント ---> libaria_event.c
以下、app.c
■ system_init.cに、青字部分を追加します。
① PICの立ち上がりを350msec遅延させます。INT035の内部制御回路が完全に立ち上がるまでの遅延時間です。 INT035が完全に立ち上がる前にPICが立ち上がり、 PICと接続しているピン(CS,RS,RD,WR,RESET 及びDATA00-DATA15)に何らかのパルス信号が入ってしまうとINT035は 永遠に立ち上がれなくなってしまいます。 PIC32MZ評価ボード(MZ100-A001)ではハードの回路で リセットICM51957Bにより650msecの遅延時間を作って、 合計1000msec(=
ハード650msec + ソフト350msec )でプログラムをつくるようにしています。 ( → INT035の立ち上がり時間に係るQ.A.) |
delay_ms(350); //INT035の内部回路が立ち上がるまで待つ
以下、system_init.c
■ libaria_events.c に青字部分を追加します。
libaria_events.cの場所は "C:\microchip\harmony\v2_04\_WK\sample204\gfx1\01
035 Led OnOff
\firmware\src\system_config\default\framework\gfx\libaria\libaria_events.c"です。
①#include <stdio.h>がないと sprintf( )に対してコンパイラワーニングがでます。ボタンウィジェットのチャタリング対策としてシステムタイマを
使いますので コールバック関数SYS_TMR_CallbackSingle( )関数のハンドル handleTimer1を定義しています。
#include <stdio.h>
bool LED; //LED点滅モード
SYS_TMR_HANDLE handleTimer1; //SYS_TMR_CallbackSingle()関数のハンドル
bool ChangeNG; //LED切替わり不可の時、1となるフラグ
char Buf[32]; //液晶表示用バッファー
②MyLibariaEvents( ) は、グラフィック液晶INT035のタッチの位置を検出してキャラクタ液晶に表示する関数です。ys_TouchGetX();ys_TouchGetY();は、
タッチの位置を検出し戻り値に座標(整数値)を返す関数です。 座標は左上端を原点(0,0) 右下端(320,240)と定義されています。例えば液晶の
中央がタッチされた場合はys_TouchGetX();ys_TouchGetY()の戻り値は それぞれ160、120 です。
この関数はAPP_Tasks( )から、システムが1巡するごとに呼び出されます。
void MyLibariaEvents(void) //APP_Tasks ()からの呼び出し
{
short int tempX,tempY;
tempX = ys_TouchGetX();
tempY = ys_TouchGetY();
lcd_cmd(0x80); //1行目の先頭へ
sprintf(Buf,"X = %d ",tempX);//タッチX座標表示
lcd_str(Buf); //液晶表示
lcd_cmd(0xC0); //2行目の先頭へ
sprintf(Buf,"Y = %d ",tempY); //タッチY座標表示
lcd_str(Buf); // 開始メッセージ1行目表示
}
③void LedFunc( )は、呼び出されるたびに、LEDが点灯していれば消灯させ、消灯していれば点灯させる関数です。
void LedFunc(void) //LEDオンオフ制御
{
if(LED == false)
{
LED = true;
PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_G, 15 ); //RG15: LED1点灯
//LATGbits.LATG15 = 1;
……
……
④ Timer_Callback1( )は、SYS_TMR_CallbackSingle( )のコールバック関数で呼び出しから500 msec後に1回だけ呼び出され フラグをクリアしています。
LedButtonがリリースされた場合500msecの間は LedがON/OFFしないようにしてチャタリングを防止しています。
LedButton_ReleasedEvent(laButtonWidget* btn)はHarmonyからアプリケーションが受け取るLedButtonのリリースイベント関数でリリースが
発生した時、制御がまわってきます。
//500msec後のコールバック関数
void Timer_Callback1 ( uintptr_t context, uint32_t currTick )
{
ChangeNG = false;
}
// LedButton - ReleasedEvent
void LedButton_ReleasedEvent(laButtonWidget* btn)
{
// Led_Control
//
//チャタリング対策
if(ChangeNG == false) //切り替わり可の場合
{
ChangeNG = true;
LedFunc(); //LEDオンオフ制御
handleTimer1 = SYS_TMR_CallbackSingle(500, 1, Timer_Callback1);//500msecの非繰り返しコールバックイベントセット
}
}
以下、libaria_events.c